iOS Block学习

Block的本质

Block

Block的本质就是C语言中的指针函数调用。我们平时在OC中写的Block代码,在clang编译的时候,都会被转换成一个静态函数,并通过Struct包装他的函数地址,用来方便进行调用。

对于Block中自动捕获的变量,会在创建block Struct的时候赋值给到struct 内的一个变量。

Block在经过clang编译后,会被转成三块实现:

  1. 是BlockImpl的结构体
  2. 是static的静态函数,实际上就是我们写的block的实际实现代码,
  3. 是BlockImplDesc,用来描述当前Block的size等信息。

对于用__block 进行描述的变量,在实际编译过程中,会变成一个堆里面的对象。

不同的Block类型

通过打印Block的类型,可以看到Block有几个不同的类型。

  • _NSConcreteStackBlock 栈上Block
  • _NSConcreteGlobalBlock 全局Block
  • _NSConcreteMallocBlock 堆上Block 将block作为函数返回值时,编译器会自动生成复制到堆上的代码。或者使用copy
__block 标记的对象

使用 __block 标记符标记的变量,会变被包装成一个对象。